home *** CD-ROM | disk | FTP | other *** search
/ BMUG PD-ROM 1995 Fall / PD-ROM F95.toast / Programming / Programming Languages / UCB Logo 3.0 ƒ / sources / standard source / init.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-08-14  |  17.6 KB  |  402 lines  |  [TEXT/ttxt]

  1. /*
  2.  *      init.c      logo init module            dvb
  3.  *
  4.  *    Copyright (C) 1993 by the Regents of the University of California
  5.  *
  6.  *      This program is free software; you can redistribute it and/or modify
  7.  *      it under the terms of the GNU General Public License as published by
  8.  *      the Free Software Foundation; either version 2 of the License, or
  9.  *      (at your option) any later version.
  10.  *  
  11.  *      This program is distributed in the hope that it will be useful,
  12.  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *      GNU General Public License for more details.
  15.  *  
  16.  *      You should have received a copy of the GNU General Public License
  17.  *      along with this program; if not, write to the Free Software
  18.  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  */
  21.  
  22. #include "logo.h"
  23. #include "globals.h"
  24. #include <string.h>
  25.  
  26. #ifdef ibm
  27. #include <stdlib.h>
  28. #endif
  29.  
  30. typedef struct priminfo {
  31.     char *name;
  32.     short minargs;
  33.     short defargs;
  34.     short maxargs;
  35.     short priority;
  36.     NODE *(*prim) ();
  37. } PRIMTYPE;
  38.  
  39. NODE *True, *False, *Right_Paren, *Left_Paren, *Toplevel, *System, *Error,
  40.      *End, *Redefp, *Caseignoredp, *Erract, *Printdepthlimit,
  41.      *Printwidthlimit, *Pause,
  42.      *If, *Ifelse, *To, *Macro, *Unbound, *Not_Enough_Node,
  43.      *Minus_Sign, *Minus_Tight, *Startup, *Query, *Output, *Op, *Stop;
  44. NODE *Null_Word = NIL;
  45.  
  46. PRIMTYPE prims[] = {
  47.     {"*", 1, 1, 1, PREFIX_PRIORITY + 3, lmul},
  48.     {"+", 1, 1, 1, PREFIX_PRIORITY + 2, ladd},
  49.     {"-", 1, 1, 1, PREFIX_PRIORITY + 2, lsub},
  50.     {"--", 1, 1, 1, PREFIX_PRIORITY + 4, lsub},
  51.     {".defmacro", 2, 2, 2, PREFIX_PRIORITY, ldefmacro},
  52.     {".eq", 2, 2, 2, PREFIX_PRIORITY, l_eq},
  53.     {".macro", -1, -1, -1, PREFIX_PRIORITY, lmacro},
  54.     {".maybeoutput", 1, 1, 1, TAIL_PRIORITY, loutput},
  55.     {".setbf", 2, 2, 2, PREFIX_PRIORITY, l_setbf},
  56.     {".setfirst", 2, 2, 2, PREFIX_PRIORITY, l_setfirst},
  57.     {".setitem", 3, 3, 3, PREFIX_PRIORITY, l_setitem},
  58.     {"/", 1, 1, 1, PREFIX_PRIORITY + 3, ldivide},
  59.     {"<", 2, 2, 2, PREFIX_PRIORITY + 1, llessp},
  60.     {"=", 2, 2, 2, PREFIX_PRIORITY + 1, lequalp},
  61.     {">", 2, 2, 2, PREFIX_PRIORITY + 1, lgreaterp},
  62.     {"?", 0, 0, 1, PREFIX_PRIORITY, lqm},
  63.     {"allopen", 0, 0, 0, PREFIX_PRIORITY, lallopen},
  64.     {"and", 0, 2, -1, PREFIX_PRIORITY, land},
  65.     {"apply", 2, 2, 2, MACRO_PRIORITY, lapply},
  66.     {"arc", 2, 2, 2, PREFIX_PRIORITY, larc},
  67.     {"arctan", 1, 1, 2, PREFIX_PRIORITY, latan},
  68.     {"array", 1, 1, 2, PREFIX_PRIORITY, larray},
  69.     {"arrayp", 1, 1, 1, PREFIX_PRIORITY, larrayp},
  70.     {"ascii", 1, 1, 1, PREFIX_PRIORITY, lascii},
  71.     {"ashift", 2, 2, 2, PREFIX_PRIORITY, lashift},
  72.     {"back", 1, 1, 1, PREFIX_PRIORITY, lback},
  73.     {"background", 0, 0, 0, PREFIX_PRIORITY, lbackground},
  74.     {"backslashedp", 1, 1, 1, PREFIX_PRIORITY, lbackslashedp},
  75.     {"beforep", 2, 2, 2, PREFIX_PRIORITY, lbeforep},
  76.     {"bf", 1, 1, 1, PREFIX_PRIORITY, lbutfirst},
  77.     {"bfs", 1, 1, 1, PREFIX_PRIORITY, lbfs},
  78.     {"bg", 0, 0, 0, PREFIX_PRIORITY, lbackground},
  79.     {"bitand", 0, 2, -1, PREFIX_PRIORITY, lbitand},
  80.     {"bitnot", 1, 1, 1, PREFIX_PRIORITY, lbitnot},
  81.     {"bitor", 0, 2, -1, PREFIX_PRIORITY, lbitor},
  82.     {"bitxor", 0, 2, -1, PREFIX_PRIORITY, lbitxor},
  83.     {"bk", 1, 1, 1, PREFIX_PRIORITY, lback},
  84.     {"bl", 1, 1, 1, PREFIX_PRIORITY, lbutlast},
  85.     {"buried", 0, 0, 0, PREFIX_PRIORITY, lburied},
  86.     {"bury", 1, 1, 1, PREFIX_PRIORITY, lbury},
  87.     {"butfirst", 1, 1, 1, PREFIX_PRIORITY, lbutfirst},
  88.     {"butfirsts", 1, 1, 1, PREFIX_PRIORITY, lbfs},
  89.     {"butlast", 1, 1, 1, PREFIX_PRIORITY, lbutlast},
  90.     {"buttonp", 0, 0, 0, PREFIX_PRIORITY, lbuttonp},
  91.     {"bye", 0, 0, 0, PREFIX_PRIORITY, lbye},
  92.     {"catch", 2, 2, 2, MACRO_PRIORITY, lcatch},
  93.     {"char", 1, 1, 1, PREFIX_PRIORITY, lchar},
  94.     {"clean", 0, 0, 0, PREFIX_PRIORITY, lclean},
  95.     {"clearscreen", 0, 0, 0, PREFIX_PRIORITY, lclearscreen},
  96.     {"cleartext", 0, 0, 0, PREFIX_PRIORITY, lcleartext},
  97.     {"close", 1, 1, 1, PREFIX_PRIORITY, lclose},
  98.     {"co", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, lcontinue},
  99.     {"contents", 0, 0, 0, PREFIX_PRIORITY, lcontents},
  100.     {"continue", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, lcontinue},
  101.     {"copydef", 2, 2, 2, PREFIX_PRIORITY, lcopydef},
  102.     {"cos", 1, 1, 1, PREFIX_PRIORITY, lcos},
  103.     {"count", 1, 1, 1, PREFIX_PRIORITY, lcount},
  104.     {"cs", 0, 0, 0, PREFIX_PRIORITY, lclearscreen},
  105.     {"ct", 0, 0, 0, PREFIX_PRIORITY, lcleartext},
  106.     {"cursor", 0, 0, 0, PREFIX_PRIORITY, lcursor},
  107.     {"define", 2, 2, 2, PREFIX_PRIORITY, ldefine},
  108.     {"definedp", 1, 1, 1, PREFIX_PRIORITY, ldefinedp},
  109.     {"difference", 2, 2, 2, PREFIX_PRIORITY, lsub},
  110.     {"dribble", 1, 1, 1, PREFIX_PRIORITY, ldribble},
  111.     {"ed", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, ledit},
  112.     {"edit", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, ledit},
  113.     {"emptyp", 1, 1, 1, PREFIX_PRIORITY, lemptyp},
  114.     {"eofp", 0, 0, 0, PREFIX_PRIORITY, leofp},
  115.     {"equalp", 2, 2, 2, PREFIX_PRIORITY, lequalp},
  116.     {"er", 1, 1, 1, PREFIX_PRIORITY, lerase},
  117.     {"erase", 1, 1, 1, PREFIX_PRIORITY, lerase},
  118.     {"erasefile", 1, 1, 1, PREFIX_PRIORITY, lerasefile},
  119.     {"erf", 1, 1, 1, PREFIX_PRIORITY, lerasefile},
  120.     {"error", 0, 0, 0, PREFIX_PRIORITY, lerror},
  121.     {"exp", 1, 1, 1, PREFIX_PRIORITY, lexp},
  122.     {"fd", 1, 1, 1, PREFIX_PRIORITY, lforward},
  123.     {"fence", 0, 0, 0, PREFIX_PRIORITY, lfence},
  124.     {"fill", 0, 0, 0, PREFIX_PRIORITY, lfill},
  125.     {"first", 1, 1, 1, PREFIX_PRIORITY, lfirst},
  126.     {"firsts", 1, 1, 1, PREFIX_PRIORITY, lfirsts},
  127.     {"forever", 1, 1, 1, MACRO_PRIORITY, lforever},
  128.     {"form", 3, 3, 3, PREFIX_PRIORITY, lform},
  129.     {"forward", 1, 1, 1, PREFIX_PRIORITY, lforward},
  130.     {"fput", 2, 2, 2, PREFIX_PRIORITY, lfput},
  131.     {"fs", 0, 0, 0, PREFIX_PRIORITY, lfullscreen},
  132.     {"fullscreen", 0, 0, 0, PREFIX_PRIORITY, lfullscreen},
  133.     {"fulltext", 1, 1, 1, PREFIX_PRIORITY, lfulltext},
  134.     {"gprop", 2, 2, 2, PREFIX_PRIORITY, lgprop},
  135.     {"greaterp", 2, 2, 2, PREFIX_PRIORITY, lgreaterp},
  136.     {"heading", 0, 0, 0, PREFIX_PRIORITY, lheading},
  137.     {"hideturtle", 0, 0, 0, PREFIX_PRIORITY, lhideturtle},
  138.     {"home", 0, 0, 0, PREFIX_PRIORITY, lhome},
  139.     {"ht", 0, 0, 0, PREFIX_PRIORITY, lhideturtle},
  140.     {"if", 2, 2, 3, MACRO_PRIORITY, lif},
  141.     {"ifelse", 3, 3, 3, MACRO_PRIORITY, lifelse},
  142.     {"iff", 1, 1, 1, MACRO_PRIORITY, liffalse},
  143.     {"iffalse", 1, 1, 1, MACRO_PRIORITY, liffalse},
  144.     {"ift", 1, 1, 1, MACRO_PRIORITY, liftrue},
  145.     {"iftrue", 1, 1, 1, MACRO_PRIORITY, liftrue},
  146.     {"int", 1, 1, 1, PREFIX_PRIORITY, linteg},
  147.     {"item", 2, 2, 2, PREFIX_PRIORITY, litem},
  148.     {"keyp", 0, 0, 0, PREFIX_PRIORITY, lkeyp},
  149.     {"label", 1, 1, 1, PREFIX_PRIORITY, llabel},
  150.     {"last", 1, 1, 1, PREFIX_PRIORITY, llast},
  151.     {"left", 1, 1, 1, PREFIX_PRIORITY, lleft},
  152.     {"lessp", 2, 2, 2, PREFIX_PRIORITY, llessp},
  153.     {"list", 1, 2, -1, PREFIX_PRIORITY, llist},
  154.     {"listp", 1, 1, 1, PREFIX_PRIORITY, llistp},
  155.     {"ln", 1, 1, 1, PREFIX_PRIORITY, lln},
  156.     {"load", 1, 1, 1, PREFIX_PRIORITY, lload},
  157.     {"local", 1, 1, -1, PREFIX_PRIORITY, llocal},
  158.     {"log10", 1, 1, 1, PREFIX_PRIORITY, llog10},
  159.     {"lowercase", 1, 1, 1, PREFIX_PRIORITY, llowercase},
  160.     {"lput", 2, 2, 2, PREFIX_PRIORITY, llput},
  161.     {"lshift", 2, 2, 2, PREFIX_PRIORITY, llshift},
  162.     {"lt", 1, 1, 1, PREFIX_PRIORITY, lleft},
  163.     {"macrop", 1, 1, 1, PREFIX_PRIORITY, lmacrop},
  164.     {"make", 2, 2, 2, PREFIX_PRIORITY, lmake},
  165.     {"member", 2, 2, 2, PREFIX_PRIORITY, lmember},
  166.     {"memberp", 2, 2, 2, PREFIX_PRIORITY, lmemberp},
  167.     {"minus", 1, 1, 1, PREFIX_PRIORITY, lsub},
  168.     {"mousepos", 0, 0, 0, PREFIX_PRIORITY, lmousepos},
  169.     {"namep", 1, 1, 1, PREFIX_PRIORITY, lnamep},
  170.     {"names", 0, 0, 0, PREFIX_PRIORITY, lnames},
  171.     {"nodribble", 0, 0, 0, PREFIX_PRIORITY, lnodribble},
  172.     {"norefresh", 0, 0, 0, PREFIX_PRIORITY, lnorefresh},
  173.     {"not", 1, 1, 1, PREFIX_PRIORITY, lnot},
  174.     {"numberp", 1, 1, 1, PREFIX_PRIORITY, lnumberp},
  175.     {"op", 1, 1, 1, TAIL_PRIORITY, loutput},
  176.     {"openappend", 1, 1, 1, PREFIX_PRIORITY, lopenappend},
  177.     {"openread", 1, 1, 1, PREFIX_PRIORITY, lopenread},
  178.     {"openupdate", 1, 1, 1, PREFIX_PRIORITY, lopenupdate},
  179.     {"openwrite", 1, 1, 1, PREFIX_PRIORITY, lopenwrite},
  180.     {"or", 0, 2, -1, PREFIX_PRIORITY, lor},
  181.     {"output", 1, 1, 1, TAIL_PRIORITY, loutput},
  182.     {"parse", 1, 1, 1, PREFIX_PRIORITY, lparse},
  183.     {"pause", 0, 0, 0, PREFIX_PRIORITY, lpause},           
  184.     {"pd", 0, 0, 0, PREFIX_PRIORITY, lpendown},
  185.     {"pe", 0, 0, 0, PREFIX_PRIORITY, lpenerase},
  186.     {"pencolor", 0, 0, 0, PREFIX_PRIORITY, lpencolor},
  187.     {"pendown", 0, 0, 0, PREFIX_PRIORITY, lpendown},
  188.     {"pendownp", 0, 0, 0, PREFIX_PRIORITY, lpendownp},
  189.     {"penerase", 0, 0, 0, PREFIX_PRIORITY, lpenerase},
  190.     {"penmode", 0, 0, 0, PREFIX_PRIORITY, lpenmode},
  191.     {"penpaint", 0, 0, 0, PREFIX_PRIORITY, lpenpaint},
  192.     {"penpattern", 0, 0, 0, PREFIX_PRIORITY, lpenpattern},
  193.     {"penreverse", 0, 0, 0, PREFIX_PRIORITY, lpenreverse},
  194.     {"pensize", 0, 0, 0, PREFIX_PRIORITY, lpensize},
  195.     {"penup", 0, 0, 0, PREFIX_PRIORITY, lpenup},
  196.     {"plist", 1, 1, 1, PREFIX_PRIORITY, lplist},
  197.     {"plists", 0, 0, 0, PREFIX_PRIORITY, lplists},
  198.     {"po", 1, 1, 1, PREFIX_PRIORITY, lpo},
  199.     {"pos", 0, 0, 0, PREFIX_PRIORITY, lpos},
  200.     {"pot", 1, 1, 1, PREFIX_PRIORITY, lpot},
  201.     {"power", 2, 2, 2, PREFIX_PRIORITY, lpower},
  202.     {"pprop", 3, 3, 3, PREFIX_PRIORITY, lpprop},
  203.     {"ppt", 0, 0, 0, PREFIX_PRIORITY, lpenpaint},
  204.     {"pr", 0, 1, -1, PREFIX_PRIORITY, lprint},
  205.     {"primitivep", 1, 1, 1, PREFIX_PRIORITY, lprimitivep},
  206.     {"print", 0, 1, -1, PREFIX_PRIORITY, lprint},
  207.     {"procedurep", 1, 1, 1, PREFIX_PRIORITY, lprocedurep},
  208.     {"procedures", 0, 0, 0, PREFIX_PRIORITY, lprocedures},
  209.     {"product", 0, 2, -1, PREFIX_PRIORITY, lmul},
  210.     {"pu", 0, 0, 0, PREFIX_PRIORITY, lpenup},
  211.     {"px", 0, 0, 0, PREFIX_PRIORITY, lpenreverse},
  212.     {"quotient", 1, 2, 2, PREFIX_PRIORITY, ldivide},
  213.     {"radarctan", 1, 1, 2, PREFIX_PRIORITY, lradatan},
  214.     {"radcos", 1, 1, 1, PREFIX_PRIORITY, lradcos},
  215.     {"radsin", 1, 1, 1, PREFIX_PRIORITY, lradsin},
  216.     {"random", 1, 1, 1, PREFIX_PRIORITY, lrandom},
  217.     {"rc", 0, 0, 0, PREFIX_PRIORITY, lreadchar},
  218.     {"rcs", 1, 1, 1, PREFIX_PRIORITY, lreadchars},
  219.     {"readchar", 0, 0, 0, PREFIX_PRIORITY, lreadchar},
  220.     {"readchars", 1, 1, 1, PREFIX_PRIORITY, lreadchars},
  221.     {"reader", 0, 0, 0, PREFIX_PRIORITY, lreader},
  222.     {"readlist", 0, 0, 0, PREFIX_PRIORITY, lreadlist},
  223.     {"readpos", 0, 0, 0, PREFIX_PRIORITY, lreadpos},
  224.     {"readword", 0, 0, 0, PREFIX_PRIORITY, lreadword},
  225.     {"refresh", 0, 0, 0, PREFIX_PRIORITY, lrefresh},
  226.     {"remainder", 2, 2, 2, PREFIX_PRIORITY, lremainder},
  227.     {"remprop", 2, 2, 2, PREFIX_PRIORITY, lremprop},
  228.     {"repeat", 2, 2, 2, MACRO_PRIORITY, lrepeat},
  229.     {"rerandom", 0, 0, 1, PREFIX_PRIORITY, lrerandom},
  230.     {"right", 1, 1, 1, PREFIX_PRIORITY, lright},
  231.     {"rl", 0, 0, 0, PREFIX_PRIORITY, lreadlist},
  232.     {"round", 1, 1, 1, PREFIX_PRIORITY, lround},
  233.     {"rt", 1, 1, 1, PREFIX_PRIORITY, lright},
  234.     {"run", 1, 1, 1, MACRO_PRIORITY, lrun},
  235.     {"runparse", 1, 1, 1, PREFIX_PRIORITY, lrunparse},
  236.     {"runresult", 1, 1, 1, MACRO_PRIORITY, lrunresult},
  237.     {"rw", 0, 0, 0, PREFIX_PRIORITY, lreadword},
  238.     {"save", 1, 1, 1, PREFIX_PRIORITY, lsave},
  239.     {"scrunch", 0, 0, 0, PREFIX_PRIORITY, lscrunch},
  240.     {"se", 0, 2, -1, PREFIX_PRIORITY, lsentence},
  241.     {"sentence", 0, 2, -1, PREFIX_PRIORITY, lsentence},
  242.     {"setbg", 1, 1, 1, PREFIX_PRIORITY, lsetbackground},
  243.     {"setbackground", 1, 1, 1, PREFIX_PRIORITY, lsetbackground},
  244.     {"setcursor", 1, 1, 1, PREFIX_PRIORITY, lsetcursor},
  245.     {"seth", 1, 1, 1, PREFIX_PRIORITY, lsetheading},
  246.     {"setheading", 1, 1, 1, PREFIX_PRIORITY, lsetheading},
  247.     {"setitem", 3, 3, 3, PREFIX_PRIORITY, lsetitem},
  248.     {"setmargins", 1, 1, 1, PREFIX_PRIORITY, lsetmargins},
  249.     {"setpc", 1, 1, 1, PREFIX_PRIORITY, lsetpencolor},
  250.     {"setpencolor", 1, 1, 1, PREFIX_PRIORITY, lsetpencolor},
  251.     {"setpenpattern", 1, 1, 1, PREFIX_PRIORITY, lsetpenpattern},
  252.     {"setpensize", 1, 1, 1, PREFIX_PRIORITY, lsetpensize},
  253.     {"setpos", 1, 1, 1, PREFIX_PRIORITY, lsetpos},
  254.     {"setread", 1, 1, 1, PREFIX_PRIORITY, lsetread},
  255.     {"setreadpos", 1, 1, 1, PREFIX_PRIORITY, lsetreadpos},
  256.     {"setscrunch", 2, 2, 2, PREFIX_PRIORITY, lsetscrunch},
  257.     {"setwrite", 1, 1, 1, PREFIX_PRIORITY, lsetwrite},
  258.     {"setwritepos", 1, 1, 1, PREFIX_PRIORITY, lsetwritepos},
  259.     {"setx", 1, 1, 1, PREFIX_PRIORITY, lsetx},
  260.     {"setxy", 2, 2, 2, PREFIX_PRIORITY, lsetxy},
  261.     {"sety", 1, 1, 1, PREFIX_PRIORITY, lsety},
  262.     {"shell", 1, 1, 2, PREFIX_PRIORITY, lshell},
  263.     {"show", 0, 1, -1, PREFIX_PRIORITY, lshow},
  264.     {"shownp", 0, 0, 0, PREFIX_PRIORITY, lshownp},
  265.     {"showturtle", 0, 0, 0, PREFIX_PRIORITY, lshowturtle},
  266.     {"sin", 1, 1, 1, PREFIX_PRIORITY, lsin},
  267.     {"splitscreen", 0, 0, 0, PREFIX_PRIORITY, lsplitscreen},
  268.     {"sqrt", 1, 1, 1, PREFIX_PRIORITY, lsqrt},
  269.     {"ss", 0, 0, 0, PREFIX_PRIORITY, lsplitscreen},
  270.     {"st", 0, 0, 0, PREFIX_PRIORITY, lshowturtle},
  271.     {"standout", 1, 1, 1, PREFIX_PRIORITY, lstandout},
  272.     {"step", 1, 1, 1, PREFIX_PRIORITY, lstep},
  273.     {"stop", 0, 0, 0, TAIL_PRIORITY, lstop},
  274.     {"sum", 0, 2, -1, PREFIX_PRIORITY, ladd},
  275.     {"test", 1, 1, 1, PREFIX_PRIORITY, ltest},
  276.     {"text", 1, 1, 1, PREFIX_PRIORITY, ltext},
  277.     {"textscreen", 0, 0, 0, PREFIX_PRIORITY, ltextscreen},
  278.     {"thing", 1, 1, 1, PREFIX_PRIORITY, lthing},
  279.     {"throw", 1, 1, 2, PREFIX_PRIORITY, lthrow},
  280.     {"to", -1, -1, -1, PREFIX_PRIORITY, lto},
  281.     {"tone", 2, 2, 2, PREFIX_PRIORITY, ltone},
  282.     {"towards", 1, 1, 1, PREFIX_PRIORITY, ltowards},
  283.     {"trace", 1, 1, 1, PREFIX_PRIORITY, ltrace},
  284.     {"ts", 0, 0, 0, PREFIX_PRIORITY, ltextscreen},
  285.     {"type", 0, 1, -1, PREFIX_PRIORITY, ltype},
  286.     {"unbury", 1, 1, 1, PREFIX_PRIORITY, lunbury},
  287.     {"unstep", 1, 1, 1, PREFIX_PRIORITY, lunstep},
  288.     {"untrace", 1, 1, 1, PREFIX_PRIORITY, luntrace},
  289.     {"uppercase", 1, 1, 1, PREFIX_PRIORITY, luppercase},
  290.     {"wait", 1, 1, 1, PREFIX_PRIORITY, lwait},
  291.     {"window", 0, 0, 0, PREFIX_PRIORITY, lwindow},
  292.     {"word", 0, 2, -1, PREFIX_PRIORITY, lword},
  293.     {"wordp", 1, 1, 1, PREFIX_PRIORITY, lwordp},
  294.     {"wrap", 0, 0, 0, PREFIX_PRIORITY, lwrap},
  295.     {"writepos", 0, 0, 0, PREFIX_PRIORITY, lwritepos},
  296.     {"writer", 0, 0, 0, PREFIX_PRIORITY, lwriter},
  297.  
  298. #ifdef mac
  299.     {"setwindowtitle", 1, 1, 1, PREFIX_PRIORITY, lsetwindowtitle},
  300.     {"settextfont", 1, 1, 1, PREFIX_PRIORITY, lsettextfont},
  301.     {"settextsize", 1, 1, 1, PREFIX_PRIORITY, lsettextsize},
  302.     {"settextstyle", 1, 1, 1, PREFIX_PRIORITY, lsettextstyle},
  303.     {"setwindowsize", 1, 1, 1, PREFIX_PRIORITY, lsetwindowsize},
  304.     {"setwindowxy", 1, 1, 1, PREFIX_PRIORITY, lsetwindowxy},
  305.     {"newconsole", 0, 0, 0, PREFIX_PRIORITY, lnewconsole},
  306.     {"graphtext", 0, 0, 0, PREFIX_PRIORITY, lgraphtext},
  307.     {"regulartext", 0, 0, 0, PREFIX_PRIORITY, lregulartext},
  308. #endif
  309.  
  310.     {0, 0, 0, 0, 0, 0}
  311. };
  312.  
  313. NODE* valref(NODE *p) {
  314.     ref(p);
  315.     return p;
  316. }
  317.  
  318. void init()
  319. {
  320.     extern long time();
  321.     int i = 0;
  322.     NODE *proc = NIL, *pname = NIL, *cnd = NIL;
  323.  
  324.     Unbound = newnode(PUNBOUND);
  325.  
  326. #ifdef bsd
  327.     srandom((int)time((long *)NULL));
  328. #else
  329.     srand((int)time((long *)NULL));
  330. #endif
  331. #ifdef ecma
  332.     for (i=0; i<128; i++)
  333.     ecma_array[i] = i;
  334.     for (i=0; i<ecma_size; i++)
  335.     ecma_array[special_chars[i]] = '\200'+i;
  336.     i = 0;
  337. #endif
  338.     logolib = getenv("LOGOLIB");
  339.     if (logolib == NULL) logolib = libloc;
  340.     editor = getenv("EDITOR");
  341.     if (editor == NULL) editor = "jove";
  342.     editorname = strrchr(editor, (int)'/');
  343.     editorname = (editorname ? editorname+1 : editor);
  344.     while (prims[i].name) {
  345.     if (prims[i].priority == MACRO_PRIORITY)
  346.         proc = reref(proc, newnode(MACRO));
  347.     else if (prims[i].priority == TAIL_PRIORITY)
  348.         proc = reref(proc, newnode(TAILFORM));
  349.     else if ((prims[i].priority & ~4) == PREFIX_PRIORITY)
  350.         proc = reref(proc, newnode(PRIM)); /* incl. -- */
  351.     else
  352.         proc = reref(proc, newnode(INFIX));
  353.     if (prims[i].priority < PREFIX_PRIORITY)
  354.         setprimpri(proc, PREFIX_PRIORITY);
  355.     else
  356.         setprimpri(proc, prims[i].priority);
  357.     setprimfun(proc, prims[i].prim);
  358.     setprimdflt(proc, prims[i].defargs);
  359.     setprimmax(proc, prims[i].maxargs);
  360.     setprimmin(proc, prims[i].minargs);
  361.     pname = reref(pname, make_static_strnode(prims[i].name));
  362.     cnd = reref(cnd, make_instance(pname, pname));
  363.     setprocnode__caseobj(cnd, proc);
  364.     if (nodetype(proc) == MACRO)
  365.         setflag__caseobj(cnd, PROC_MACRO);
  366.     i++;
  367.     }
  368.     deref(proc);
  369.     deref(cnd);
  370.     deref(pname);
  371.     True = intern(make_static_strnode("true"));
  372.     False = intern(make_static_strnode("false"));
  373.     Left_Paren = intern(make_static_strnode("("));
  374.     Right_Paren = intern(make_static_strnode(")"));
  375.     Minus_Sign = intern(make_static_strnode("-"));
  376.     Minus_Tight = intern(make_static_strnode("--"));
  377.     Query = intern(make_static_strnode("?"));
  378.     Null_Word = intern(make_static_strnode("\0"));
  379.     To = intern(make_static_strnode("to"));
  380.     Macro = intern(make_static_strnode(".macro"));
  381.     Toplevel = intern(make_static_strnode("toplevel"));
  382.     System = intern(make_static_strnode("system"));
  383.     Error = intern(make_static_strnode("error"));
  384.     End = intern(make_static_strnode("end"));
  385.     If = intern(make_static_strnode("if"));
  386.     Ifelse = intern(make_static_strnode("ifelse"));
  387.     Redefp = intern(make_static_strnode("redefp"));
  388.     Caseignoredp = intern(make_static_strnode("caseignoredp"));
  389.     setvalnode__caseobj(Caseignoredp, True);
  390.     setflag__caseobj(Caseignoredp, VAL_BURIED);
  391.     Erract = intern(make_static_strnode("erract"));
  392.     Printdepthlimit = intern(make_static_strnode("printdepthlimit"));
  393.     Printwidthlimit = intern(make_static_strnode("printwidthlimit"));
  394.     Pause = intern(make_static_strnode("pause"));
  395.     Startup = intern(make_static_strnode("startup"));
  396.     Output = intern(make_static_strnode("output"));
  397.     Op = intern(make_static_strnode("op"));
  398.     Stop = intern(make_static_strnode("stop"));
  399.     the_generation = valref(cons(NIL, NIL));
  400.     Not_Enough_Node = valref(cons(NIL, NIL));
  401. }
  402.